home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-05 / pktmux11.zip / PKTMUX.DOC < prev    next >
Text File  |  1992-05-01  |  71KB  |  1,486 lines

  1. /* C:\DOC\PKTMUX.DOC ***** 1 MAY 92 ** 11:25 ******; G W Robinson
  2.  
  3.  
  4.                    R A L   I B M   P C   U S E R   G U I D E
  5.                    -----------------------------------------
  6.  
  7.                        PKTMUX Packet Driver Multiplexor
  8.                        --------------------------------
  9.  
  10.  
  11.       Contents
  12.       ========
  13.  
  14.       1.    Introduction and Disclaimer
  15.  
  16.       2.    Installation
  17.  
  18.       3.    Overview
  19.  
  20.       4.    Usage Guidelines
  21.  
  22.       5.    Program Description
  23.       5.1     PKTMUX.EXE
  24.       5.2     PKTDRV.EXE
  25.       5.3     PKTSTATS.EXE
  26.       5.4     WINPKT.COM
  27.  
  28.       6.    Examples
  29.       6.1     Packet Driver, PCTCP and PC-NFS Applications under DOS
  30.       6.2     MOS2 under DOS
  31.       6.3     Packet Driver Applications under Windows 3
  32.       6.4     Packet Driver, PCTCP and PC-NFS Applications under Windows 3
  33.       6.5     Windows 3 Applications
  34.  
  35.       7.    Technical Description
  36.       7.1     Basic Methodology
  37.       7.2     Buffer Strategy
  38.       7.3     Control Programs
  39.       7.4     Listeners and /l Options
  40.       7.5     Port Duplication
  41.       7.6     IP Fragmentation
  42.       7.7     Other IP Protocols
  43.       7.8     Channel Management
  44.  
  45.       8.    Problem Solving
  46.  
  47.       9.    Bugs/Features and Problem Programs
  48.  
  49.       10.   Differences in PKTMUX versions
  50.  
  51.       11.   Support
  52.  
  53.       12.   References
  54.  
  55.  
  56.  
  57.  
  58.       1. Introduction and Disclaimer
  59.       ==============================
  60.  
  61.       The author and his employers accept no responsibilty for any damage
  62.       done by this software.  It is run strictly at the user's risk and
  63.       all necessary precautions, such as backing up of discs, should be
  64.       taken before hand.
  65.  
  66.       Similarily the vendors/authors of applications and Packet Drivers
  67.       accept no responsibility for problems and malfunctions, and will
  68.       give no support, when their software is used with PKTMUX.
  69.  
  70.       This document describes PKTMUX which is a program that provides a
  71.       multiplexing interface to a Packet Driver. It thus allows several
  72.       IP protocol stacks to be run in parallel either under DOS or a
  73.       control program such as Windows 3 or DESQview.
  74.  
  75.       Multiplexing IP protocol stacks is a non trivial problem and this
  76.       program is only likely to meet about 90% of user requirements.
  77.       There will always be 10% who need a more sophisticated product.
  78.       Because PKTMUX makes certain probability assumptions it is also
  79.       highly likely that it will make a mistake every now and then when
  80.       they are not valid.  At best an application will recover from this
  81.       situation and at worse something, possibly even the whole PC, will
  82.       fail.  It is therefore likely that PKTMUX will never be 100%
  83.       reliable and in some situations it may be so flakey as to be
  84.       unusable.
  85.  
  86.       This documents version 1.1, which is the first release with some
  87.       bug fixes and minor enhancements.  The programs from this version
  88.       must not be mixed with those from version 1.0 as they are
  89.       incompatible.  Further details of the differences are given at the
  90.       end of this document.
  91.  
  92.  
  93.       2. Installation
  94.       ===============
  95.  
  96.       The system comes as a single program named PKTMUXxx.EXE where xx is
  97.       the version number, currently 11.  When this program is run it
  98.       expands into several files.  These are:
  99.  
  100.         PKTMUX.EXE      The packet multiplexor
  101.         PKTDRV.EXE      The pseudo Packet Driver interface to PKTMUX
  102.         PKTSTATS.EXE    A program state and statistics display program
  103.         PKTMUX.DOC      This documentation
  104.  
  105.       In addition a free program WINPKT.COM and a source listing
  106.       WINPKT.ASM is supplied since this provides some of PKTMUX's
  107.       functionality and is rather smaller.
  108.  
  109.       The programs should be copied into a directory in the Path such as
  110.       C:\BIN on RAL machines.  PKTMUX.DOC should be put in a
  111.       documentation directory such as C:\DOC on RAL machines.  The BAT
  112.       file INSTALL.BAT does this.
  113.  
  114.  
  115.  
  116.  
  117.       3. Overview
  118.       ===========
  119.  
  120.       The Packet Driver interface was developed by FTP Software Inc as a
  121.       standardised way of accessing different makes of communications
  122.       cards.  It is widely used especially over ethernets and a large
  123.       amount of communications software is available for it.  The
  124.       ethernet implementation makes use of the fact that two bytes in the
  125.       header define the packet type and this is used to provide a
  126.       multiplexing mechanism between several packet types.  However it
  127.       looks no further into the protocol stack and thus this feature is
  128.       of limited use when protocols of the same type, such as those from
  129.       the TCP/IP family, are used.
  130.  
  131.       PKTMUX attempts to remove this limitation by providing a
  132.       multiplexing facility for Internet Protocols (IP).  This is done by
  133.       not only switching on the packet type (which denotes IP) but also
  134.       the IP protocol type (which can denote IP protocols TCP, UDP, ICMP
  135.       and others).  In the case of TCP and UDP it can also switch on the
  136.       Port number being used.  It is therefore possible to run more than
  137.       one IP protocol stack at the same time.  It is not possible to
  138.       multiplex other protocol stacks or more than one of each IP
  139.       protocol type other than TCP, UDP or ICMP.
  140.  
  141.       PKTMUX was originally written to meet the needs of the RAL MOS2
  142.       program which is a TSR (Terminate and Stay Resident) program that
  143.       provides IBM 3270 emulation over asynchronous and ethernet
  144.       communications.  In this context it provides two functions for the
  145.       TCP/IP version of MOS2.  On is that it allows additional
  146.       communications applications to run alongside MOS2.  This is useful
  147.       because, since MOS2 is a TSR, you can hot key back to DOS and run
  148.       other commands.  Thus an LPR or FTP can be run alongside the MOS2
  149.       3270 session.
  150.  
  151.       A second requirement was to allow MOS2 to run under a control
  152.       program such as Windows 3 or DESQview.  This is an instance of a
  153.       more general problem in running an application which uses a Packet
  154.       Driver under a control program.  It arises because the Packet
  155.       Driver, which is loaded before Windows, calls the application when
  156.       it has received a packet.  This is quite satisfactory under DOS but
  157.       under Windows there is no certainty that the application is
  158.       currently running and there is therefore the risk of jumping into
  159.       the middle of another program with dire consequences.  A Packet
  160.       Driver option -w gets over this by checking that part of the
  161.       application program code is present and throwing away the packet if
  162.       not.  This leads to a rather slow data rate as the protocol timeout
  163.       and retry mechanisms have to be brought into play to recover from
  164.       the situation.  A better solution is provided by the free software
  165.       WINPKT which only works under Windows 3 Enhanced mode and uses
  166.       Windows 3 facilities to make sure the application is running.  A
  167.       copy of WINPKT is provided in this package.  WINPKT has the
  168.       drawback that it does not work with other control programs such as
  169.       DESQview and also with certain ethernet cards such as the BICC 16
  170.       bit varient.  PKTMUX meets this requirement and gives the
  171.       additional feature of being able to run communications applications
  172.       in more than one window.
  173.  
  174.  
  175.  
  176.       Given the widespread use of Packet Driver it is surprising that
  177.       nobody has written a PKTMUX before.  It is probably because a
  178.       general purpose multiplexor is impossible to implement.  PKTMUX
  179.       only attempts to meet the needs of IP protocols and is therefore
  180.       likely to be of little use in other situations.  It must however be
  181.       emphasised that PKTMUX will only work when the probability of
  182.       various identifying values being duplicated is low and that when
  183.       duplication does occur then the various retry mechanisms can
  184.       recover from the mess.  If this is not the case the PKTMUX is of
  185.       little use.
  186.  
  187.       PKTMUX has so far been tested satisfactorily with PCTCP, PC-NFS,
  188.       CUTCP and Waterloo TCP.  It also works over the RAL LLCPKT2
  189.       program.
  190.  
  191.       Further technical details are given in the Program and
  192.       Technical Description sections.
  193.  
  194.  
  195.       4. Usage Guidelines
  196.       ===================
  197.  
  198.       The following give basic usage guidelines.  For more detail consult
  199.       the Program Descriptions and Examples sections. All programs except
  200.       give help when run with the /h option.
  201.  
  202.       The normal procedure for running a communications application is to
  203.       load a Packet Driver and then run the application. To introduce
  204.       multiplexing into this PKTMUX and PKTDRV must be loaded after the
  205.       Packet Driver and before the application.
  206.  
  207.       Thus under DOS type the following after you have loaded the Packet
  208.       Driver:
  209.  
  210.         PKTMUX n                ; n is the maximum number of packet
  211.                                 ; driver channels to support - default 2
  212.         PKTDRV                  ; repeated n times - displays Interrupt
  213.                                 ; used
  214.  
  215.       Then run the applications as required.  Note the first ones must
  216.       usually be TSRs otherwise you cannot get back to DOS to load
  217.       subsequent applications.  Applications which search for a Packet
  218.       Driver will find the first free PKTDRV.  Once an application
  219.       starts using PKTDRV it becomes busy and is no longer recognised as
  220.       a Packet Driver.  Note that this only happens once the application
  221.       has started communicating over the network so each application
  222.       must be got to this state before further applications are loaded.
  223.       If not then two applications will link into the same PKTDRV.
  224.       Applications for which you have to specify the Packet Driver
  225.       Interrupt should be set for the highest PKTDRV Interrupt to avoid
  226.       conflicts.
  227.  
  228.       For usage under a control program such as Windows 3 run PKTMUX as
  229.       above but dont run PKTDRV until after the control program is
  230.       active.  Then run one copy of PKTDRV in any DOS session from which
  231.       you wish to use a communications application that runs over a
  232.       Packet Driver.
  233.  
  234.       For applications that run directly under Windows 3 (eg WINQVT)
  235.       either use WINPKT or, if further packet driver channels are
  236.       required, then run PKTMUX as above and then one PKTDRV before
  237.       Windows 3 is loaded.  Then start up the Windows application which
  238.       will use this PKTDRV.  Further applications running in DOS sessions
  239.       must have their PKTDRV loaded before they are run.
  240.  
  241.       The program PKTSTATS gives details of program states and various
  242.       statistics.
  243.  
  244.  
  245.  
  246.       5. Program Descriptions
  247.       =======================
  248.  
  249.  
  250.       5.1 PKTMUX.EXE
  251.       --------------
  252.  
  253.       This is a TSR that provides, in conjunction with PKTDRV, multiple
  254.       IP protocol channels to a Packet Driver. Its format is:
  255.  
  256.         PKTMUX  chan_cnt pkt_drv_int chan_time_out /options
  257.  
  258.       which installs the multiplexor on the first packet driver it finds
  259.       or hex interrupt "pkt_drv_int" is this is specified (note 1).
  260.       "Chan_cnt" channels are supported - default is 2 (note 2).
  261.       "chan_time_out" is the time in seconds a timed out channel waits
  262.       before being reset (note 6).  PKTMUX memory usage ranges from 13K
  263.       for one channel to 20K for four channels.
  264.  
  265.       The following options modify the action taken:
  266.  
  267.         a  display additional information on loading.
  268.         d  drop packets if application has no buffers (note 5).
  269.         o  override use of specified interrupt (note 1).
  270.         h  display this help information.
  271.         r  reset timed out channels; rr resets internal flags as well and
  272.            should be used with care (note 6).
  273.         t  terminate PKTMUX and Packet Driver (note 3).
  274.         u  unload PKTMUX if not being used by a PKTDRV (note 3).
  275.         x  multiplex all received packets - testing only (note 7).
  276.         1 to 9  allocate buffers for this channel count (note 4).
  277.  
  278.       Examples are:
  279.  
  280.         pktmux               ; normal use - 2 channels
  281.         pktmux 4             ; install to multiplex four applications
  282.         pktmux 2 62          ; install on Packet Driver at Int 62
  283.         pktmux /u            ; unload PKTMUX (dont forget to unload
  284.                              ; PKTDRVs first)
  285.         pktmux 4 /2          ; install to multiplex four applications but
  286.                              ; only allocate enough buffers for two
  287.         pktmux /r            ; reset timed out channels
  288.  
  289.       Notes:
  290.  
  291.       1.  By default PKTMUX searches for a Packet Driver and, on finding
  292.       one, takes over its interrupt effectively hiding it so it cannot be
  293.       found by any other application.  There is then no confusion between
  294.       the real Packet Driver and the pseudo ones provided by PKTDRV.
  295.       Note that PKTMUX will refuse to load if during its search for a
  296.       Packet Driver either another PKTMUX or a PKTDRV is found or if one
  297.       of these is the specified pkt_drv_int.  This latter restriction can
  298.       be overcome by the /o (override) option.
  299.  
  300.  
  301.       2.  By default PKTMUX supports two Packet Driver channels.  This
  302.       means it will communicate with up to two copies of PKTDRV and
  303.       provide two pseudo Packet Driver interfaces.  Each PKTDRV acts,
  304.       within limits, as if it were a Packet Driver with its own ethernet
  305.       card albiet with the same MAC address as any others.  PKTMUX
  306.       supports up to four busy copies of PKTDRV.  Note that supporting
  307.       only one channel achieves the same effect as a normal Packet Driver
  308.       and is only useful where PKTMUX provides additional functionality
  309.       such as allowing an application to run under Windows 3.
  310.  
  311.       3.  The /u option causes PKTMUX to unload unless a PKTDRV is still
  312.       busy.  The /t option does the same thing but also sends a terminate
  313.       request to the Packet Driver, which will also unload if it supports
  314.       this facility.
  315.  
  316.       4.  By default PKTMUX allocates a basic set of buffers and then
  317.       adds an additional one to each size group for each channel.  Tests
  318.       suggest this is adequate for most cases.  However this can be
  319.       overridden by giving /n where n is a decimal number in the range 0
  320.       to 9.  PKTMUX will then allocate buffers as if this number of
  321.       channels were to be used.  This can be used to either save memory
  322.       by reducing the buffer allocation or increasing the number of
  323.       buffers when experience suggests it is needed.  The memory overhead
  324.       per channel is a little over 2K.
  325.  
  326.       The buffer allocation is shown by PKTMUX when it is loaded and in
  327.       detail by running PKTSTATS /a after PKTMUX has been loaded.
  328.  
  329.       5. PKTMUX does its best to avoid losing data by holding packets in
  330.       its buffers when an application is unable to accept them. In some
  331.       cases this can cause a shortage of buffers. The /d (drop) option
  332.       causes PKTMUX to behave exactly as a Packet Driver and to drop any
  333.       packet that is refused by an application because it has
  334.       insufficient buffer space. This option acts on all channels and
  335.       overrides a similar option on PKTDRV which works on a per channel
  336.       basis.
  337.  
  338.       6.  When running under Windows 3 or DESQview with a PKTDRV and the
  339.       application in a DOS session then, if the session is terminated
  340.       without closing down the application, PKTMUX is left with the
  341.       channel marked as Busy.  It will either be freed after
  342.       "Chan_time_out" seconds (default infinity) or the option /r (reset)
  343.       can be used on a call to PKTMUX to reset all such channels.  If /rr
  344.       is given then the busy flags in PKTMUX are also reset which could
  345.       cause it to fail.  See also the PKTDRV /r option and the section on
  346.       Channel Management in the Technical Description below for further
  347.       details.
  348.  
  349.       7.  By default PKTMUX sends data direct to the application when
  350.       only one channel is in use.  If the /x option is given then packets
  351.       are copied to a buffer and multiplexed by the normal mechanisms as
  352.       if several channels were operational.  This is therefore a test
  353.       facility to check if PKTMUX is able to support an application
  354.       irrespective of any other application that is running.
  355.  
  356.  
  357.  
  358.  
  359.       5.2 PKTDRV.EXE
  360.       --------------
  361.  
  362.       This is a TSR which provides the pseudo Packet Driver interface in
  363.       conjunction with PKTMUX.  Its format is:
  364.  
  365.         PKTDRV pkt_drvr_int mux_int all_type /options
  366.  
  367.       which uses the multiplexor on hex interrupt "mux_int" or by default
  368.       searches for it.  It installs itself as a Packet Driver on hex
  369.       interrupt "pkt_drvr_int" or, by default, the first free interrupt
  370.       after the multiplexor (note 1).  The "all_type" parameter
  371.       (repeatable) defines the packet TYPE values used when an
  372.       application asks for all types (eg PC-NFS).  The default setting is
  373.       0800 and 0806 (note 2).  PKTDRV memory usage is a little over 1K.
  374.  
  375.       The following options modify the action taken:
  376.  
  377.         c   copy send buffers (note 3).
  378.         d   drop packets if application has no buffers (note 5).
  379.         f   force PKTDRV to be Free; !f forces to Busy (note 1)
  380.         h   display this help information.
  381.         l   act as listener for any protocol type (note 4).
  382.        !l   dont act as listener for any protocol type.
  383.         lf  act as listener for TCP FTP; !lf negates.
  384.         li  act as listener for IP; !li negates.
  385.         lt  act as listener for TCP; !lt negates.
  386.         lt# act as listener for TCP port # (decimal); !lt# negates.
  387.         lu  act as listener for UDP only; !lu negates.
  388.         lu# act as listener for UDP port # (decimal); !lu# negates.
  389.         r   reset a PKTDRV that is busy (note 1).
  390.         t   terminate PKTDRV, PKTMUX and Packet Driver (note 6).
  391.         u   unload last loaded PKTDRV if Busy (note 6).
  392.         uu  unload last loaded PKTDRV even if Busy.
  393.         ur  repeatedly unload last loaded PKTDRV if not Busy.
  394.  
  395.       Examples are:
  396.  
  397.         pktdrv               ; normal use
  398.         pktdrv /c            ; copy send buffers
  399.         pktdrv 66 62         ; multiplexor on 62, put Packet Driver on 66
  400.         pktdrv /t            ; terminate PKTDRV, PKTMUX and Packet Driver
  401.         pktdrv /u            ; unload last PKTDRV to be loaded
  402.         pktdrv /uu           ; unload last PKTDRV to be loaded even if Busy
  403.         pktdrv 63 /u         ; unload PKTDRV on Int 63
  404.         pktdrv 0 0 800 806 1000 ; Application wanting all packet types will
  405.                                 ; just get 0800, 0806 and 1000
  406.         pktdrv /!l /lf       ; not a listener for any service except FTP
  407.         pktdrv /lt21         ; listener for TCP port 21
  408.  
  409.  
  410.  
  411.       Notes:
  412.  
  413.       1.  PKTDRV by default uses the next free Interrupt after that used
  414.       by PKTMUX.  It avoids Interrupts 61, 62 and 64, as these are used
  415.       by PCTCP, Vista eXceed and Novell respectively, and also 67 as this
  416.       is the EMS entry point.  Interrupts 70 - 76 are normally in use on
  417.       all but the XT type PCs.
  418.  
  419.       Note that under a control program, such as Windows 3, PKTDRV will,
  420.       by default, use the same Interrupt in each DOS session it is loaded
  421.       in.  This is because each DOS session has its own version of the
  422.       Interrupts.  For the same reason PKTSTATS will only see the PKTDRV,
  423.       if any, in the DOS session yet will display the correct total that
  424.       are busy.
  425.  
  426.       Part of the Packet Driver definition is the use of the string PKT
  427.       DRVR just after the interrupt entry point in order to identify it.
  428.       A communications application which does not require the explicit
  429.       definition of the Packet Driver interrupt searches from Interrupt
  430.       60 up to 80 until it finds one.  PKTDRV uses the same mechanism and
  431.       so appears to be a genuine Packet Driver.  However once a
  432.       communications application has accessed PKTDRV the identification
  433.       is changed and only reverts back when the application has given a
  434.       release command.  Thus several copies of PKTDRV can provide the
  435.       impression that multiple Packet Drivers are present.  The state of
  436.       each PKTDRV is shown by calling PKTSTATS - Free means it can be
  437.       used by an application and Busy means its identification has been
  438.       changed and it is in use.
  439.  
  440.       One problem with this mechanism is when two applications can use
  441.       the same Packet Driver - for example PCTCP running alongside a
  442.       Novell Packet Driver - then doing this over PKTDRV will fail.  One
  443.       solution is to use separate PKTDRV for each.  Alternatively once
  444.       the first application has been started and the PKTDRV is now Busy
  445.       then a command of the form:
  446.  
  447.         pktdrv pkt_drvr_int /f
  448.  
  449.       forces the state back to Free. A second application can then be
  450.       loaded which finds PKTDRV and can use it.
  451.  
  452.       The opposite problem is when an application is loaded, locates a
  453.       Free PKTDRV but does not issue any commands and thus change the
  454.       PKTDRV state to Busy.  The call:
  455.  
  456.         pktdrv pkt_drvr_int /!f
  457.  
  458.       forces the PKTDRV to be Busy thus subsequent applications will not
  459.       find it.
  460.  
  461.  
  462.       If a PKTDRV is marked as Busy and the application has terminated
  463.       (or crashed!) then calling PKTDRV with /r option will reset the
  464.       specified "pkt_drvr_int" PKTDRV.  Note that /r resets the channel
  465.       whereas /f simply resets the program identification and leaves all
  466.       the call details intact.  If the PKTDRV was also terminated at the
  467.       same time as the application, such as when a Windows DOS session is
  468.       terminated, then the channel is Busy but there is no PKTDRV to send
  469.       a Reset to.  In this case PKTMUX will have registered that the
  470.       PKTDRV has gone and giving the command:
  471.  
  472.         pktmux /r
  473.  
  474.       will reset any Busy channel for which there is no PKTDRV.
  475.  
  476.       Note in the three PKTDRV calls if the "pkt_drvr_int" is not
  477.       specified then a search is made from the last possible PKTDRV
  478.       Interrupt number (80) back to the first (60).  Thus a generalised
  479.       use of the feature is possible provided the PKTDRV being used is
  480.       the last one that was loaded and/or the highest Interrupt number.
  481.  
  482.       A copy of PKTDRV can be loaded at any time.  If it is required to
  483.       unload the system at some later time it is perhaps wise to load all
  484.       the PKTDRV copies that are required under DOS just after PKTMUX.
  485.       This minimises the chance of problems with interrupt chains but
  486.       means that any use of the /f or /r options need the "pkt_drvr_int"
  487.       specifying.
  488.  
  489.       2.  Instead of requesting certain packet types some applications,
  490.       notably PC-NFS, ask for all packet types.  PKTMUX does not allow
  491.       this since it makes its job extremely difficult so PKTDRV
  492.       intercepts such a request and replaces it by specific packet types.
  493.       By default these are 0800 (IP Protocols) and 0806 (ARP - Address
  494.       Resolution Protocols) and these are all PC-NFS really needs for its
  495.       own use.  Where further packet types are required these can be
  496.       overridden and alternatives supplied.
  497.  
  498.       One limitation of this implementation is that an application with a
  499.       genuine requirement for all packet types cannot be supported.  An
  500.       example is IEEE 802.3 (ISO 8802/3) where the packet type field is
  501.       used as the packet size.  Thus implementations of ISO CONS
  502.       (Pinkbook in the UK academic community) cannot run over PKTMUX.
  503.       Users of the UK Academic community's RAINBOW software who wish to
  504.       use TCP/IP alongside it should run the RAL LLCPKT2 product which
  505.       provides a packet driver interface.  This interface can then be
  506.       either used directly by an application or via PKTMUX for several
  507.       applications.  Note however that the overheads are significant.
  508.  
  509.       3.  Under Windows 3 (and possibly DESQview) some communications
  510.       cards which use DMA (direct memory access) for sending data don't
  511.       work properly.  The same thing can happen when the application is
  512.       located in upper memory (ie above 640K).  The solution is to copy
  513.       the data from the application's buffer into one in PKTMUX and send
  514.       it from there.  This is done by the /c option and it only applies
  515.       to data sent via that PKTDRV.  The only card so far found to
  516.       require this is the BICC 16bit ethernet card though this may be
  517.       dependent on the PC hardware and the EMM in use.
  518.  
  519.  
  520.  
  521.       4.  The /l and /!l options indicate whether or not the application
  522.       using this PKTDRV should act as a listener for well known services.
  523.       See Technical Description below for further details.
  524.  
  525.       5.  The /d (drop) option makes this PKTDRV channel behave as a
  526.       normal Packet Driver and drop any packet for which the application
  527.       has no buffer rather than holding it in a buffer which is the
  528.       default.  The PKTMUX option /d implements the same feature for all
  529.       channels and overrides the PKTDRV setting.
  530.  
  531.       6.  The /u option causes PKTDRV to unload unless it is still busy
  532.       with an application.  Adding an /r requests all PKTDRVs be
  533.       unloaded.  Note this may not be possible if other TSRs where loaded
  534.       between PKTDRVs.  If it is known that an application is not Busy,
  535.       such as when it has crashed, then the /uu option will force the
  536.       unload.  The /t option does the same thing but also sends a
  537.       terminate request to PKTMUX which, if it is acceptable, will also
  538.       send a terminate request to the Packet Driver.
  539.  
  540.       If the "pkt_drvr_int" is not specified then a search is made from
  541.       the last possible PKTDRV Interrupt number (80) back to the first
  542.       (60).  Thus a generalised use of this feature is only possible
  543.       provided the PKTDRV being unloaded is the last one that was loaded
  544.       and also the highest Interrupt number.
  545.  
  546.  
  547.  
  548.  
  549.       5.3 PKTSTATS.EXE
  550.       ----------------
  551.  
  552.       This program displays program details and statistics from PKTMUX.
  553.       Its format is:
  554.  
  555.         PKTSTATS /options
  556.  
  557.       The following options modify the action taken:
  558.  
  559.         a  display further information - can be repeated (note 1).
  560.         h  display this help information.
  561.  
  562.       Examples are:
  563.  
  564.         pktstats             ; normal use
  565.         pktstats /a          ; show further information
  566.  
  567.  
  568.       Notes:
  569.  
  570.       1.  The option /a can be repeated up to 3 times to give increasing
  571.       levels of information.  This is mainly intended for debugging
  572.       purposes.  Repeating /a 3 times can get the program in a loop or
  573.       give misleading information since it scans queues which may be
  574.       changing.  This is intended only for cases when PKTMUX has stopped
  575.       with a system error.
  576.  
  577.       2.  The counts given by PKTSTATS are 16 bit integers so will
  578.       overflow over a period of time.
  579.  
  580.       3.  In the output from PKTSTATS where the name before a count value
  581.       is in CAPITAL letters then this indicates that data is being lost
  582.       or discarded for some reason.  Further details are given in the
  583.       section on Problem Solving.
  584.  
  585.  
  586.       5.4 WINPKT.COM
  587.       --------------
  588.  
  589.       This program is not part of the PKTMUX system but since it provides
  590.       a subset of the facilities for a smaller memory requirement it is
  591.       included.  In is not supported by RAL.  In accordance with the
  592.       distribution licence the source is also supplied in WINPKT.ASM.
  593.       The program COPYING mentioned at start up is not supplied as I dont
  594.       have a copy.
  595.  
  596.       WINPKT acts as an interface between an application running under
  597.       Windows 3 in Enhanced mode and a Packet Driver.  It uses Windows 3
  598.       calls so is specific to this case.  Its format is:
  599.  
  600.         WINPKT new_pkt_drvr_int old_pkt_drvr_int
  601.  
  602.       where "old_pkt_drvr_int" is the interrupt of the Packet Driver in
  603.       either decimal or hex preceeded by 0x.  "new_pkt_drvr_int" is the
  604.       new interrupt to use and cannot be the same as "old_pkt_drvr_int".
  605.       There are no documented options.
  606.  
  607.  
  608.       Examples are:
  609.  
  610.         winpkt 0x63 0x64        ; Packet driver on Interrupt 64, WINPKT
  611.                                 ; accessed via Interrupt 63
  612.         winpkt                  ; provide help information
  613.  
  614.  
  615.       Notes:
  616.  
  617.       1.  WINPKT should be loaded after the Packet Driver and before
  618.       Windows 3 is loaded.  It is recommended that "new_pkt_drvr_int" is
  619.       before "old_pkt_drvr_int" since applications that search for a
  620.       packet driver will find the driver and not WINPKT.
  621.  
  622.       2.  WINPKT has no unloading mechanism so if unloading is required
  623.       the RAL LOADSYS system or similar must be used.
  624.  
  625.       3. WINPKT may not work with certain ethernet cards. The BICC 16 bit
  626.       card is the only know example so far found. PKTMUX should be used
  627.       in these cases along with the /c option on PKTDRV.
  628.  
  629.  
  630.  
  631.       6.  Examples
  632.       ============
  633.  
  634.       The following examples illustrate the use of PKTMUX and attempt to
  635.       show the various possible uses of the system. It assumes a degree
  636.       of familiarity with setting up and use of the various systems
  637.       exampled. Examples include the RAL MOS2 IBM 3270 emulator since
  638.       this system was one of the reasons for writing PKTMUX. The RAL
  639.       LOADSYS program to load and unload TSRs and Device Drivers can also
  640.       be useful in running multiple protocol stacks. Details of both are
  641.       given in the Reference Section.
  642.  
  643.       In general there are two classes of communications applications.
  644.       The simplest are those that just need a Packet Driver in order to
  645.       work, for example the CUTCP programs PING, LPR and FTPBIN.  A more
  646.       complicated type are those applications which require their own TSR
  647.       to be loaded first.  The applications then communicate via this
  648.       instead of directly to the Packet Driver.  Examples are
  649.       applications that run over PCTCP and PC-NFS.
  650.  
  651.       Another twist are those applications that either are, or can
  652.       become, TSRs and thus allow you to return to DOS.  Thus further
  653.       applications can be run.  Examples are MOS2 which is a TSR and FTP
  654.       which via the command !  becomes a TSR and starts up a DOS session.
  655.  
  656.  
  657.       6.1 Packet Driver, PCTCP and PC-NFS Applications under DOS
  658.       ----------------------------------------------------------
  659.  
  660.       The following illustrates how to run a Packet Driver application
  661.       alongside those requiring their own TSR to be loaded.  The first is
  662.       for PCTCP and assumes IPCUST.SYS and IFCUST.SYS are loaded in
  663.       CONFIG.SYS.
  664.  
  665.         ne2000 0x63 0x5 0x320    ; Load Packet Driver for NE2000 card
  666.         pktmux                   ; Support 2 channels
  667.         pktdrv                   ; PKTDRV for PCTCP to use
  668.         pktdrv                   ; PKTDRV for Packet Driver application
  669.                                  ; to use
  670.         ethdrv                   ; PCTCP Packet Driver interface
  671.  
  672.       You can now run applications from the PCTCP program suite, such as
  673.       FTP, PING or LPR. Programs that just require a Packet Driver can
  674.       also be run such as FTPBIN from the CUTCP program suite.
  675.  
  676.       The following illustrates how to run a Packet Driver application
  677.       alongside the PC-NFS TSR.  It is assumed that SOCKDRV.SYS, PKTD.SYS
  678.       and ANSI.SYS are loaded in CONFIG.SYS.
  679.  
  680.  
  681.         pcnfs.sys /b1            ; loaded in CONFIG.SYS
  682.  
  683.         mbdndpd 0x63 /I10 /D3    ; Load Packet Driver for BICC 16 bit
  684.                                  ; card
  685.         pktmux                   ; Support 2 channels
  686.         pktdrv                   ; PKTDRV for PC-NFS to use
  687.         pktdrv                   ; PKTDRV for Packet Driver application
  688.         cd \nfs
  689.         prt *                    ; Normal PC-NFS loading
  690.         nfsrun
  691.  
  692.       PC-NFS applications such as NFSPING can now be run as well as those
  693.       just requiring a Packet Driver such as FTPBIN from CUTCP.
  694.  
  695.  
  696.       6.2 MOS2 under DOS
  697.       ------------------
  698.  
  699.       The RAL MOS2 IBM 3270 Emulator v2.3 is a TSR.  It supports the
  700.       Waterloo TCP/IP protocol stack and is normally run by loading the
  701.       Packet Driver and then running the file MOS2T.BAT.  To achieve this
  702.       using PKTMUX type:
  703.  
  704.         ne2000 0x63 0x5 0x320    ; Load Packet Driver
  705.         pktmux                   ; Support 2 channels
  706.         pktdrv                   ; PKTDRV for MOS2 to use
  707.         pktdrv                   ; PKTDRV for applications to use
  708.         mos2t                    ; Run MOS2
  709.  
  710.       Once MOS2 is running you can then hot key (Alt-Esc) back to DOS and
  711.       then any other communications application which runs over a Packet
  712.       Driver can be used. For example PING from the Waterloo TCP/IP
  713.       suite or FTPBIN or LPR from the CUTCP suite. For example:
  714.  
  715.         ftpbin ib                ; establish FTP communications with IB
  716.  
  717.  
  718.       To run MOS2 alongside applications from the PCTCP applications
  719.       suite the following is suggested:
  720.  
  721.         ne2000 0x63 0x5 0x320    ; Load Packet Driver
  722.         pktmux                   ; Support 2 channels
  723.         pktdrv                   ; PKTDRV for PCTCP to use
  724.         pktdrv                   ; PKTDRV for MOS2 to use
  725.         ethdrv                   ; PCTCP Packet Driver interface
  726.         mos2t                    ; Run MOS2
  727.  
  728.       Once MOS2 is running the PCTCP applications can be used.
  729.  
  730.       A combination of the two cases, that is the ability to run
  731.       applications from the PCTCP program suite or any other application
  732.       that runs directly over a Packet Driver can be achieved by the
  733.       following:
  734.  
  735.  
  736.  
  737.         ne2000 0x63 0x5 0x320    ; Load Packet Driver
  738.         pktmux 3                 ; Support 3 channels
  739.         pktdrv                   ; PKTDRV for PCTCP to use
  740.         pktdrv                   ; PKTDRV for MOS2 to use
  741.         pktdrv                   ; PKTDRV for applications to use
  742.         ethdrv                   ; PCTCP Packet Driver interface
  743.         mos2t                    ; Run MOS2
  744.  
  745.       Once MOS2 is running either the PCTCP applications or those
  746.       requiring a Packet Driver can be used.
  747.  
  748.       Note that it is possible to run MOS2 before loading PCTCP but this
  749.       is not recommended.  Loading PCTCP first removes any problems
  750.       with the provision of well known services such as an FTP listener.
  751.       If MOS2 must be loaded first then its PKTDRV should have the /!l
  752.       option so that any incoming calls for well known services are
  753.       routed to the next PKTDRV which should be the one for PCTCP.
  754.  
  755.  
  756.       6.3 Packet Driver Applications under Windows 3
  757.       ----------------------------------------------
  758.  
  759.       The following illustrates how to run Packet Driver applications
  760.       under Windows 3. Use under DESQview is very similar.
  761.  
  762.         ne2000 0x63 0x5 0x320    ; Load Packet Driver
  763.         pktmux 4                 ; Support 4 channels
  764.         win                      ; Run Windows 3
  765.  
  766.       To run an application open a DOS session and type:
  767.  
  768.         pktdrv                   ; PKTDRV for application to use
  769.  
  770.       followed by the application. The application could be the MOS2
  771.       emulator BAT file for example:
  772.  
  773.         mos2t
  774.  
  775.       To run further applications just open more DOS sessions and run
  776.       PKTDRV then the application.  However be warned that Windows 3.0
  777.       can become unstable if you have insufficient memory and opening
  778.       too many DOS sessions may result in a Unrecoverable Application
  779.       Error.  This usually does no damage and other sessions are
  780.       unaffected.  Note also that, unless the PC is quite powerful,
  781.       applications may fail as they will not get enough CPU to process
  782.       their communications in time and protocols may time out.
  783.  
  784.  
  785.  
  786.       6.4 Packet Driver, PCTCP and PC-NFS Applications under Windows 3
  787.       ----------------------------------------------------------------
  788.  
  789.       This is essentially the same as under DOS but with the PKTDRV for
  790.       the Packet Driver application run under a DOS session. For example
  791.       to run both PCTCP and Packet Driver applications the following
  792.       would suffice.
  793.  
  794.         ne2000 0x63 0x5 0x320    ; Load Packet Driver
  795.         pktmux 4                 ; Support 4 channels
  796.         pktdrv                   ; PKTDRV for PCTCP to use
  797.         ethdrv                   ; PCTCP Packet Driver interface
  798.         win                      ; Run Windows 3
  799.  
  800.       To run a Packet Driver application open a DOS session and type:
  801.  
  802.         pktdrv                   ; PKTDRV for application to use
  803.  
  804.       followed by the application. For PCTCP applications just run the
  805.       application.
  806.  
  807.  
  808.       6.5  Windows 3 Applications
  809.       ---------------------------
  810.  
  811.       Windows 3 applications are slightly different in that they do not
  812.       run in a DOS session so it is not possible to run PKTDRV after
  813.       Windows has been loaded.  For those that run over PCTCP or PC-NFS
  814.       then the appropriate TSR is loaded under DOS after PKTMUX and one
  815.       PKTDRV as illustrated above.  The application is then run under
  816.       Windows as normal.
  817.  
  818.       For those that run over a Packet Driver, for example WINQVT, then
  819.       the procedure is very similar to running them under DOS, that is
  820.       the PKTDRV is loaded before Windows 3. For example to run WINQVT
  821.       and also other applications that use a Packet Driver the following
  822.       would suffice:
  823.  
  824.         ne2000 0x63 0x5 0x320    ; Load Packet Driver
  825.         pktmux 4                 ; Support 4 channels
  826.         pktdrv                   ; PKTDRV for WINQVT to use
  827.         pktint                   ; WINQVT Packet Driver interface
  828.         win                      ; Run Windows 3
  829.  
  830.       Then run WINQVT as normal with QVT_TCP.RC edited to contain the
  831.       line:
  832.  
  833.       packet_vector=65
  834.  
  835.       This is done because WINQVT has to have its Packet Driver
  836.       interrupt specified and PKTDRV will use 65. If there is any doubt
  837.       then PKTDRV could have its interrupt number specified as the
  838.       first parameter for example:
  839.  
  840.         pktdrv 65
  841.  
  842.  
  843.  
  844.  
  845.       If several PKTDRVs had been loaded it would be better to give the
  846.       one for WINQVT a high interrupt number (eg 7F) to guarantee it
  847.       will be free.
  848.  
  849.       To run further Packet Driver applications open a DOS session and
  850.       run PKTDRV and the application as before.  To run PCTCP or PC-NFS
  851.       applications then modify the above to include the TSR before
  852.       loading Windows.  Alternatively for PCTCP the TSR can be run under
  853.       Windows 3 inside a DOS session since it is effectively a Packet
  854.       Driver application.  IPCUST.SYS and IFCUST.SYS must have previously
  855.       been loaded in CONFIG.SYS or could be loaded by the RAL LOADSYS
  856.       system.
  857.  
  858.  
  859.  
  860.       7.  Technical Description
  861.       =========================
  862.  
  863.       This section describes how PKTMUX goes about its task and is
  864.       intended for those who wish to understand how the system works and
  865.       why it has the limitations it has.  An understanding of the Packet
  866.       Driver interface is assumed.  The various PKTMUX counts and states
  867.       detailed below are shown the command:
  868.  
  869.         pktstats /a
  870.  
  871.       Additional states are given by the option /aa.
  872.  
  873.  
  874.       7.1 Basic Methodology
  875.       ---------------------
  876.  
  877.       In essence the system is very simple.  PKTMUX talks to the Packet
  878.       Driver and receives data from it.  Each PKTDRV passes all commands
  879.       onto PKTMUX with the addition of the channel number.  PKTDRV also
  880.       sits on a timer interrupt and asks PKTMUX once per system tick if
  881.       there are any packets for this channel and if so then gets them
  882.       passed over.  A PKTDRV is only Busy from when it has been
  883.       asked by an application to Assign a packet type to when that is
  884.       Released.  In between it remains Free.
  885.  
  886.       Whilst PKTMUX makes every attempt to be efficient it does create a
  887.       significant overhead when multiplexing between several
  888.       applications.  This is because the Packet Driver interface only
  889.       tells you it has a packet and does not give a pointer so that you
  890.       can see if you are interested in its contents.  Where only one
  891.       application is using this packet type then the packet is sent
  892.       direct to the application.  Otherwise it is necessary for PKTMUX to
  893.       read the packet into its own storage, analyse its contents and then
  894.       send it when asked by a PKTDRV to the appropriate application(s).
  895.       Thus every packet received in this manner has to be copied once
  896.       more than necessary.
  897.  
  898.  
  899.       7.2 Buffer Strategy
  900.       -------------------
  901.  
  902.       When an application is unable to accept a packet, usually because
  903.       it has no free buffer space, then PKTMUX keeps the packet in its
  904.       buffers and every timer tick keeps asking the application to accept
  905.       it.  It does this even when it normally sends data direct to the
  906.       application, thus those applications which operate on a small
  907.       buffer pool may lose less data when under PKTMUX especially when
  908.       they receive less CPU cycles when running under Windows 3.  The
  909.       decision whether to keep a packet when an application is unable to
  910.       accept it is a difficult one and depends on the available buffer
  911.       pool and activity on other channels.  The ultimate criterion is the
  912.       age of the buffer and after between 2 and 3 seconds it is dropped.
  913.       Whilst this mechanism is satisfactory for most applications there
  914.       are some that give problems.  One that has been noted is TRUMPET
  915.       which, when an interaction has been completed and it is waiting for
  916.  
  917.  
  918.  
  919.       user input, refuses to accept any more packets.  Whilst
  920.       PKTMUX's buffer strategy will cope in normal circumstances, under
  921.       heavy loading this could give problems.  The /d option is therefore
  922.       available on PKTDRV which causes a packet to be always dropped when
  923.       an application is unable to accept it.  Thus it behaves exactly as
  924.       a Packet Driver.  The /d option is also available on PKTMUX to
  925.       provide this feature on all channels and could be used in cases of
  926.       extreme loading.
  927.  
  928.       All packets dropped because the application cannot accept them are
  929.       counted as LOST in the PKTSTATS figures for each PKTDRV channel.
  930.  
  931.  
  932.       7.3 Control Programs
  933.       --------------------
  934.  
  935.       One of the problems with the Packet Driver interface is that when
  936.       it receives a packet it then calls a routine in the application.
  937.       This will not fail under DOS but if the application is running
  938.       under a control program such as Windows 3 or DESQview, where the
  939.       application can be swopped in and out of the current virtual
  940.       memory, then there is a need to establish that the current
  941.       application is the correct one.  PKTMUX does this by noting the
  942.       code it is to jump to when a packet is received and checking if
  943.       that is present.  This works satisfactorily unless two copies of
  944.       the same application are running and in this case the application
  945.       has to be tagged in a unique way.
  946.  
  947.       Note that there are two ways of using PKTDRV under a control
  948.       program.  The preferred way is to load it in a DOS session after
  949.       the control program has been started and then run the application.
  950.       In this way when PKTDRV asks PKTMUX if it has received a buffer it
  951.       can be sure the application is in memory and so minimises any
  952.       delay.  Alternatively when an application runs directly under the
  953.       control program it is therefore not possible to load PKTDRV in the
  954.       same virtual memory so it has to be loaded under DOS before the
  955.       control program.  It therefore has no certainty that the
  956.       application is running when it asks PKTMUX if any data has been
  957.       received so sometimes has to wait until its timer interrupt
  958.       coincides with the time slice of the application.  This can slow
  959.       things down considerably and may require PKTMUX to have a larger
  960.       buffer pool in order to cope.
  961.  
  962.  
  963.  
  964.       7.4 Listeners and /l Options
  965.       ----------------------------
  966.  
  967.       One of the problems PKTMUX has to solve is to which application to
  968.       route packets for which it has no previous knowledge.  Examples are
  969.       ARP requests and calls to previously unused TCP or UDP ports.
  970.       Experience has shown it is best to send ARP requests to all
  971.       applications.  For TCP and UDP ports the requests can be either for
  972.       well know services (such as TELNET or FTP) in which case the
  973.       default is to send it to the first application to sign up for that
  974.       packet type in the hope that it has a listener for this service.
  975.       This avoids more than one response to such a request.
  976.       Alternatively it may be to a port previously notified by the
  977.       application and in this case it is sent to all applications who use
  978.       that packet type.  This latter technique works provided the
  979.       application is tolerant of such unsolicited messages.  Tests so far
  980.       indicate that PC-NFS and CUTCP dont mind.  However PCTCP and
  981.       Waterloo TCP are more strict and send back an error message.  For
  982.       TCP this is a RST (reset) and for UDP it is an ICMP Port Undefined
  983.       message.  Since this upsets the service being used such cases are
  984.       trapped and the error message filtered out.  In the PKTSTATS output
  985.       they are counted under "Ignored:  err Resp" and under "Ign" in the
  986.       "PKTDRV channels:" tables.  Note that there is currently no way of
  987.       preventing such unsolicited messages being sent to an application
  988.       and the /l options only apply to packets for well known ports.
  989.  
  990.       The definition of a well known port is a little vague these days.
  991.       Originally it was 0-255 but the Unix fraternity officially extended
  992.       this to 1024 for Unix Standard Services and the current RFC 1106
  993.       list goes way beyond this value.  As some applications assume this
  994.       rule in their port usage so PKTMUX designates ports 0-255 as well
  995.       known and routes them to only one channel.  Any other services
  996.       outside this range are likely to be provided by a specialist server
  997.       so sending to all should locate it.  This may be revised in the
  998.       light of experience.
  999.  
  1000.       The various /l options on PKTDRV override the default setting for
  1001.       well know services and indicate where such a request should be
  1002.       sent or not.  Options of the form /l indicate this application has
  1003.       servers of this type and /!l indicates it does not.  The absence
  1004.       of an /l or /!l option means the application provides all servers
  1005.       but it is used only when no other application has an /l option.
  1006.  
  1007.       The /l option types are implemented as an hierarchy with the
  1008.       specific protocol ports for TCP and UDP taking precedence over the
  1009.       protocols themselves which in turn take precedence over the
  1010.       protocol family (IP).  Last in precedence is a general listener.
  1011.       The applications are also searched in reverse order of loading so
  1012.       that a later application can take precedence over an earlier one.
  1013.  
  1014.  
  1015.       The simplest method of making sure the main services such as FTP
  1016.       are found is to load that application first.  Where this is not
  1017.       possible then the PKTDRVs for applications that do not support
  1018.       servers over a protocol should be marked as such by an /!l (ie not
  1019.       a listener) type option so that it is avoided when looking for the
  1020.       default.  And any application that wants to take over from the
  1021.       default can be marked by an /l (ie I am a listener) type option.
  1022.       Note that requests will be discarded if no listener is found.
  1023.  
  1024.       PKTSTATS will display the listener settings for each channel.
  1025.  
  1026.  
  1027.       7.5 Port Duplication
  1028.       --------------------
  1029.  
  1030.       When an application makes a call to a service it specifies the
  1031.       port to which replies should be sent.  How this port number is
  1032.       generated is dependent on the application.  There is therefore a
  1033.       possibility that two applications could generate the same reply
  1034.       port number.  To combat this PKTMUX inspects all reply port
  1035.       numbers in outgoing packets for TCP and UDP and replaces any new
  1036.       and duplicated number by the next one higher, if that is not in
  1037.       use.  It also resets the packet header sumcheck if this is being
  1038.       used.  Port numbers on incoming packets are similarily mapped.
  1039.       Thus it is possible to run two copies of the same application
  1040.       without any problems of port duplication.
  1041.  
  1042.       However there are two areas that cannot be fixed.  One is where the
  1043.       application specifies the reply port via the protocol.  For example
  1044.       FTP usually specifies the port to be used for the file transfer via
  1045.       the PORT command in its controlling data stream.  Since PKTMUX does
  1046.       not analyse the data going through it this is not noted.  There is
  1047.       therefore the possibility that such a port number may be duplicated
  1048.       if two copies of the same application are run.  Fortunately tests
  1049.       with the FTP implementations from PCTCP and CUTCP have not shown
  1050.       this to be a problem.
  1051.  
  1052.       The second is where the reply port is a well known port and an
  1053.       example of this is BOOTP. In this case it assumed that any
  1054.       duplicate use of this port is by an application taking over the
  1055.       function this well known port supports. Thus a BOOTP exchange on
  1056.       one channel will be assumed complete when a second channel uses
  1057.       BOOTP. If this is not the case, as it would be if two applications
  1058.       started up at the same time, then hopefully the BOOTP retry
  1059.       mechanisms will recover the situation.
  1060.  
  1061.  
  1062.       7.6 IP Fragmentation
  1063.       --------------------
  1064.  
  1065.       IP Fragmentation is a means whereby a large packet is carried
  1066.       through a network whose packet size limit is too small. It is done
  1067.       by simply putting the extra data into the data part of one or more
  1068.       IP packets ie. where you would normally expect the TCP or UDP
  1069.       header to be. The constituent packets of the fragment are linked by
  1070.       having the same IP Identification.
  1071.  
  1072.       PKTMUX notes the channel that the first fragment is sent to and
  1073.       then routes all further fragments with the same Identifier to that
  1074.       channel. This works satisfactorily for most cases but has some
  1075.       potential problems.
  1076.  
  1077.  
  1078.  
  1079.       The first is when the fragments arrive out of order.  As PKTMUX
  1080.       needs the first packet in order to get the TCP or UDP header out
  1081.       then any fragment that arrives before this packet will be
  1082.       discarded. Such cases are recorded in the NO FRAGMENT count of
  1083.       PKTSTATS output. The protocol retry mechanisms should retransmit
  1084.       the packet and hopefully the first packet of the fragment will
  1085.       arrive first and everything will be ok.
  1086.  
  1087.       The second is a more difficult problem in that if the same IP
  1088.       Identification is used by two fragmentation sources then PKTMUX has
  1089.       no way of distinquishing between the two.  Hopefully this will be
  1090.       very rare and the receiving application(s) should spot that they
  1091.       have the wrong fragments and their retry mechanisms should recover
  1092.       the situation.
  1093.  
  1094.       Note that when fragmentation is occurring then the number of
  1095.       received and copied fragments (excluding the first) is displayed by
  1096.       PKTSTATS.
  1097.  
  1098.  
  1099.       7.7 Other IP Protocols
  1100.       ----------------------
  1101.  
  1102.       PKTMUX is only able to multiplex on IP protocols it knows about.
  1103.       These currently are TCP, UDP and ICMP. Any other IP protocol type
  1104.       will be handled correctly provided there is only one channel using
  1105.       it. Multiple usage of another IP protocol will therefore fail.
  1106.       Provided any such protocol had a port mechanism of some form it
  1107.       would be possible add support to PKTMUX if required.
  1108.  
  1109.  
  1110.       7.8 Channel Management
  1111.       ----------------------
  1112.  
  1113.       Normally a channel is freed when the application Releases all the
  1114.       packet types is has Accessed.  If this does not occur, usually
  1115.       because the application has crashed, then there are two possible
  1116.       cases.
  1117.  
  1118.       The first, and most normal, is where the PKTDRV being used by the
  1119.       application is still running and is a call the PKTSTATS shows it to
  1120.       be Busy. The command:
  1121.  
  1122.         pktdrv /r
  1123.  
  1124.       will reset the PKTDRV and free the channel.
  1125.  
  1126.       The second case is when the PKTDRV is not running.  PKTMUX detects
  1127.       this by the absense of any timer interrupts and frees the channel
  1128.       after about two seconds.  However this technique fails under a
  1129.       control program such as Windows 3 or DESQview since the DOS session
  1130.       can be locked thus preventing the PKTDRV from sending its timer
  1131.       interrupts.  An example is when an area is Selected under Windows 3
  1132.       for such actions as cut and paste.
  1133.  
  1134.  
  1135.  
  1136.       To overcome this PKTMUX does not immediately free such channels
  1137.       when running under a control program but this gives the new problem
  1138.       that it now has no means of knowing the channel can be freed.  Such
  1139.       channels are marked as having Timed Out and this is displayed by
  1140.       PKTSTATS.  To reset such a channel use the following command:
  1141.  
  1142.         pktmux /r
  1143.  
  1144.       in a DOS session and this will make all such channels free again.
  1145.  
  1146.       An automatic means of recovery from this situation is provided by
  1147.       the third PKTMUX parameter, Chan_time_out.  This is the time in
  1148.       seconds the call stays in a timed out state before being freed
  1149.       automatically.  However this should be set with care since if you
  1150.       spend too long on your cut and paste the channel may be freed and
  1151.       your application will fail.
  1152.  
  1153.       One side effect of an application crashing is that it may leave
  1154.       PKTMUX in one of its internal busy states. This is shown by the
  1155.       PKTSTATS /aa output in the line "Busy Flags". If this occurs then
  1156.       PKTMUX will effectively go to sleep. When this is the case then the
  1157.       call:
  1158.  
  1159.         pktmux /rr
  1160.  
  1161.       will also reset these flags and PKTMUX may resume working. It may
  1162.       also crash!
  1163.  
  1164.  
  1165.  
  1166.  
  1167.       8. Problem Solving
  1168.       ==================
  1169.  
  1170.       This section attempts to suggest how problems with PKTMUX should be
  1171.       tackled. It is worthwhile reading the meaning of the various
  1172.       options and also the Technical Description above in order to
  1173.       ascertain if your problem and its solution is documented therein.
  1174.       Also the section on Bugs/Features and Problem Programs should be
  1175.       consulted.
  1176.  
  1177.       One of the biggest difficulties with PKTMUX is sorting out why
  1178.       something is not working properly.  To assist in this the utility
  1179.       PKTSTATS is provided which, when used with the /a option, gives
  1180.       details of what PKTMUX is up to and its various counts.  Any count
  1181.       whose name is in CAPITAL letters indicates data being lost or
  1182.       discarded because there is a problem and the following attempts to
  1183.       explain what they mean.  Note that such counts are usually only
  1184.       displayed when they have a value so their absence indicates all
  1185.       should be well.
  1186.  
  1187.       The first class of problems is where PKTMUX simply does not work
  1188.       with an application.  The first test is to run the application on
  1189.       its own having loaded PKTMUX with the /x option.  Normally in this
  1190.       situation PKTMUX would pass data direct to the application but with
  1191.       the /x option (multiplex) it copies data to its buffers and uses
  1192.       its multiplexing facilities thus checking if they can cope with the
  1193.       application.  If this fails then the application probably has some
  1194.       quirk that confuses PKTMUX.  If it is a standard application that
  1195.       works elsewhere then you may have a networking set up that PKTMUX
  1196.       cannot cope with.
  1197.  
  1198.       A second test is to add the /c (copy) option to each PKTDRV. This
  1199.       causes it to copy the data sent to the network into its own
  1200.       buffers and this has been known to cure problems related to the use
  1201.       of upper and/or EMS/XMS memory.
  1202.  
  1203.       Where an application works with PKTMUX as above but not in
  1204.       conjunction with other applications then it is worth trying
  1205.       different combinations and seeing what does and does not work.
  1206.       This may isolate one application as being the problem or show a
  1207.       certain loading order to be the cause.  Possible reasons are that a
  1208.       listener for a well known port is being usurped by another
  1209.       application (see PKTDRV /l option) or that one application simply
  1210.       prevents any other from running.  Check the Bugs/Features and
  1211.       Problem Programs section for any indication of problems.  It is
  1212.       also worthwhile checking if anyone else has a similar problem.
  1213.  
  1214.       Another class of problems is where PKTDRV is marked Busy when it
  1215.       should be Free or there are no Free PKTMUX channels.  This is
  1216.       usually due to applications failing in some manner and the means of
  1217.       recovery are described in the Channel Management part of the
  1218.       Technical Description section.
  1219.  
  1220.  
  1221.       The final, and probably the largest, class of problems is where
  1222.       everything works for a while then things start going wrong. Using
  1223.       PKTSTATS can give an indication of the cause but in general it is
  1224.       only those cases where the problem can be reproduced that a
  1225.       solution can be found with any degree of certainty. Note that
  1226.       PKTMUX depends on probability for its successfull working and when
  1227.       the odds are wrong it will fail for no apparent reason. However for
  1228.       regular failures the suggestions below may help.
  1229.  
  1230.       A general technique is to run PKTSTATS /a and note the various
  1231.       counts.  Then run the application(s) that cause the failure and
  1232.       subsequently run PKTSTATS /a again and note which counts have
  1233.       increased.  This should give a clue about whats going wrong.
  1234.  
  1235.       A possible reason for an application not working properly is that
  1236.       it, or PKTMUX, has run out of buffers with which to receive data.
  1237.       This is especially prevalent under a control program such as
  1238.       Windows where applications do not get enough CPU time to process
  1239.       their data.  Details of buffer usage are given in the "Buffers:"
  1240.       table and for the case of PKTMUX running out of buffers the count
  1241.       "PKTMUX NO BUFFER" is given in the "Queues" line.  Increasing the
  1242.       number of buffers used via the /1 to /9 options on PKTMUX should
  1243.       solve this one.
  1244.  
  1245.       Detecting that the application is running out of buffers is more
  1246.       difficult since PKTMUX may not be able to deliver the data for a
  1247.       variety of reasons.  This can be isolated by running the
  1248.       application on its own over PKTMUX (without the /c option).  As it
  1249.       has only one channel operative PKTMUX just passes all calls
  1250.       directly to the application.  Any refusal by an application to
  1251.       supply a buffer causes PKTMUX to copy the data into its own
  1252.       buffers.  This is shown in the Copied count on the "Recv total"
  1253.       line and the PKTDRV channel counts.  The only solution is to
  1254.       increase the applications buffers if this is possible.
  1255.  
  1256.       When PKTMUX has more than one channel Busy, and has to wait to
  1257.       pass received data to an application, this is also recorded in the
  1258.       PKTDRV table.  The wait reason is either no buffer available from
  1259.       application (Buff) or, under Windows 3 or DESQview only, the
  1260.       application was not in memory (App).  The latter is especially
  1261.       prevalent for background processes paticularily when a foreground
  1262.       process requires a lot of CPU.  When it has to wait PKTMUX has to
  1263.       decide whether to try again later or discard the buffer.  The
  1264.       latter is only done when PKTMUX has several channels that are
  1265.       actually moving data at the same time and it has insufficient
  1266.       buffers to meet all their demands.  The "LOST" count in the "PKTDRV
  1267.       channels:" table would be incremented in this instance and again
  1268.       increasing the number of PKTMUX and/or application buffers is a
  1269.       possible solution.  It may be that, especially under Windows 3 or
  1270.       DESQview, the PC has simply not enough horsepower to cope with the
  1271.       communications load as well as any processing in progress at the
  1272.       same time.  Thus the application(s) are not processing the received
  1273.       data fast enough to cope with the incoming rate. Alternatively it
  1274.       may be an application, such as TRUMPET, that refuses to accept
  1275.       packets when it knows it is not expecting data.
  1276.  
  1277.  
  1278.       Another reason that data may be discarded is when there is no
  1279.       listener for the service that is being requested.  The count "NO
  1280.       LISTENER" is incremented in the "Recv ignored reasons" list.  There
  1281.       are several possible reasons for this but in general it is because
  1282.       the /l and /!l options on PKTDRV calls dont leave a suitable
  1283.       listener.  Note that this count will not be incremented if there is
  1284.       a listener available but it does not support the service requested.
  1285.       In this case an application that supports the service must be run
  1286.       with a PKTDRV that routes requests for the service to it by using
  1287.       the /l or /!l options.
  1288.  
  1289.       A final reason for discarding data is when an IP Fragment arrives
  1290.       out of order.  If it arrives before the first fragment then PKTMUX
  1291.       has no way of knowing to which channel it belongs and so discards
  1292.       it and increments the count "NO FRAGMENT" in the "Recv ignored
  1293.       reasons" list. The subsequent retry should overcome this problem
  1294.       provided that this time the first fragment arrives first.
  1295.  
  1296.  
  1297.  
  1298.  
  1299.       9. Bugs/Features and Problem Programs
  1300.       =====================================
  1301.  
  1302.       The following list of situations that need special action.  It is
  1303.       based upon limited experience so only covers a few cases at
  1304.       present.
  1305.  
  1306.       The 16 bit BICC ethernet cards require the /c option on PKTDRV
  1307.       when running under a control program and dont work with WINPKT.
  1308.       The /c is not required when under DOS but is needed when a
  1309.       protocol stack such as PCTCP is run under DOS for a Windows 3
  1310.       application such as Vista eXceed X Windows.
  1311.  
  1312.       When the X Window server Vista eXceed is running over PCTCP it
  1313.       must have enough buffers allocated via the ETHDRV command otherwise
  1314.       the call will be reset at intervals and thus fail. An ETHDRV call
  1315.       similar to the following is recommended:
  1316.  
  1317.          ethdrv -t 10 -p 20
  1318.  
  1319.       Further details are given the Vista eXceed and PCTCP manuals.  It
  1320.       may also be necessary to increase the PKTMUX buffer allocation when
  1321.       using this or other X Windows servers.
  1322.  
  1323.       PKTMUX will not work with the packet driver version of Novell IPX
  1324.       if the PKTDRV is using Interrupt 64. This is because Interrupt 64
  1325.       is a Novell API and so from v1.1 onwards it is not allocated by
  1326.       default.
  1327.  
  1328.       PKTMUX tends to operate a lot with interrupts disabled. This may
  1329.       cause problems with time critical communications methods such as
  1330.       asynchronous links using SLIP.
  1331.  
  1332.       TRUMPET refuses to accept packets when it is waiting for user input
  1333.       and expects no more data.  This can cause PKTMUX to run out of
  1334.       buffers under heavy loading. In this case it is recommended
  1335.       that the /d option be added to the PKTDRV used by TRUMPET.
  1336.  
  1337.       When PC-NFS is in use alongside PCTCP then a TSR, such as the MOS2
  1338.       3270 emulator, is unable to run when the PCTCP FTP program is
  1339.       waiting for a command. The problem does not occur with the CUTCP
  1340.       FTP so it appears to be related to the wait loop used by the PCTCP
  1341.       FTP when waiting for a command.
  1342.  
  1343.       There have been reports of PCNFS and PCTCP not working together
  1344.       over PKTMUX. As it works for other users there is obviously some
  1345.       other factor that is not currently appreciated and investigations
  1346.       are continuing.
  1347.  
  1348.  
  1349.  
  1350.  
  1351.  
  1352.       10. Differences in PKTMUX versions
  1353.       ==================================
  1354.  
  1355.  
  1356.       10.1 Version 1.0
  1357.       ----------------
  1358.  
  1359.       First release to prove that the techniques worked.  Note this
  1360.       version does not support IP Fragmentation.
  1361.  
  1362.  
  1363.       10.2 Version 1.0a
  1364.       -----------------
  1365.  
  1366.       PKTMUX now checks that it is loading on top of a real Packet Driver
  1367.       and aborts if it finds its actually a PKTDRV.
  1368.  
  1369.  
  1370.       10.3 Version 1.1
  1371.       ----------------
  1372.  
  1373.       The programs from this version must not be mixed with those from
  1374.       version 1.0 as they are incompatible.
  1375.  
  1376.       In searching for a Packet Driver PKTMUX now checks the interrupts
  1377.       to see if PKTMUX or PKTDRV is already loaded and aborts if one is.
  1378.       Similarily if the Packet Driver interrupt is specified this is
  1379.       checked to see if it is a real Packet Driver.  This is to prevent
  1380.       multiple loadings of the system.  The option /o (override) has
  1381.       been added to PKTMUX to override this restriction.
  1382.  
  1383.       PKTMUX now starts by default with 2 channels.
  1384.  
  1385.       PKTDRV options /f and /!f have been added to force a PKTDRV to the
  1386.       Free or Busy state.  The PKTSTATS output has been changed to
  1387.       reflect this.
  1388.  
  1389.       PKTDRV no longer uses Interrupt 64 by default as this clashes with
  1390.       a Novell API.
  1391.  
  1392.       IP Fragmentation was not supported in previous versions.  It is now
  1393.       supported within limitations (see Technical Description).
  1394.  
  1395.       The buffer management system has been improved especially with
  1396.       regard to discarding unwanted packets. The option /d (drop) has
  1397.       been added to tell PKTMUX to drop all packets for which the
  1398.       application has no buffer rather than keeping them until the
  1399.       application has space. The same option is available on PKTDRV which
  1400.       works on a per channel basis. The number base of buffers has been
  1401.       also been increased in some cases.
  1402.  
  1403.       A bug in the Packet Driver handle mapping when PC-NFS was in use
  1404.       has been fixed as has one in the area of duplicate handles.
  1405.  
  1406.       A bug in the mapping of ICMP packets onto channels has been fixed.
  1407.       The bug caused ICMP packets containing IP data to be sent all
  1408.       channels.
  1409.  
  1410.  
  1411.  
  1412.       PKTMUX v1.0 used a time out mechanism to determine whether a PKTDRV
  1413.       and its application had been forcably terminated under a Windows or
  1414.       DESQview environment.  Unfortunately this mechanism was also
  1415.       triggered when the window was Selected under Windows 3 for actions
  1416.       such as cut and paste and caused the channel to be closed down.
  1417.       This has been changed in v1.1 so that in these circumstances a
  1418.       channel will not be closed down. The option /r has been added to
  1419.       PKTMUX to reset such channels otherwise they are permanently busy
  1420.       and there is no PKTDRV to reset them. A third parameter has also
  1421.       been added to PKTMUX to reset such channels after a given time.
  1422.  
  1423.       ARP Request Broadcasts are now sent to all channels.  The /la
  1424.       option is therefore no longer needed.  The handling of Broadcast
  1425.       packets has also been improved so that only those ARP requests that
  1426.       are not for this address are discarded.
  1427.  
  1428.       BOOTP did not work for second and subsequent channels because it
  1429.       replies on a well known port and this only went to the first
  1430.       listener. This has now been changed and the response is sent to
  1431.       originator of the BOOTP provided no other channel has done a BOOTP
  1432.       in between. If this occurs then the timeout and retry mechanisms
  1433.       should recover the situation.
  1434.  
  1435.       The problem solving section has been improved and the /v option
  1436.       (multiplex) added to PKTMUX to assist this process.
  1437.  
  1438.  
  1439.  
  1440.  
  1441.       11. Support
  1442.       ===========
  1443.  
  1444.       PKTMUX is supplied free and is supported, within the limits of its
  1445.       specification, for all users at RAL on IBM PC and PS/2 computers
  1446.       and near clones.  Note that support is confined to bugs in the
  1447.       programs and clarification in the documentation of the systems
  1448.       limitations.
  1449.  
  1450.       Users outside RAL are requested in the first instance to obtain
  1451.       copies and help from their normal support sources.
  1452.  
  1453.       Academic user support organisations may seek help from RAL but the
  1454.       latter will only be given on a 'best endeavours' basis.
  1455.  
  1456.       There is no support for other organisations other than by private
  1457.       arrangement with the author.
  1458.  
  1459.       Updates of the software may be file transferred from the binary
  1460.       file PKTMUXxx EXE (xx being version number without a point -
  1461.       currently 11) on the RAL IBM mainframe (UK.AC.RL.IB on JANET,
  1462.       IB.RL.AC.UK on the Internet) disc PCSOFT 192.  TCP/IP users of
  1463.       Anonymous FTP should CD to PCSOFT.192 and binary GET PKTMUXxx.EXE.
  1464.       Executing the file will produce the program and documentation.
  1465.       Further details of how this is done can be obtained by email from
  1466.       the author.
  1467.  
  1468.       Bug reports or problems should be reported, ideally by email, to
  1469.       Graham Robinson:
  1470.  
  1471.       Via JANET    : GWR@UK.AC.RL.IB         G W Robinson
  1472.       Via Internet : GWR@IB.RL.AC.UK         Atlas Centre
  1473.       UK Telephone : 0235 44 5636 or 6391    Rutherford Appleton Laboratory
  1474.       International: +44 235 44 5636         Chilton, Didcot
  1475.                                              Oxon,OX11 0QX,UK
  1476.  
  1477.       12. References
  1478.       ==============
  1479.  
  1480.       The RAL LOADSYS system version 1.4 is held in file LOAD14 EXE on
  1481.       PCSOFT 192 as detailed above.
  1482.  
  1483.       The RAL MOS2 IBM 3270 emulator version 2.3 is held in files MOS23
  1484.       EXE, MOS23X EXE and MOS23Y EXE on PCSOFT 192.
  1485.  
  1486.